package com.sptpc.hello.controller;


import com.sptpc.hello.controller.requests.ModifyCategoryRequest;
import com.sptpc.hello.controller.requests.ModifyDrinkRequest;
import com.sptpc.hello.modei.Drink;
import com.sptpc.hello.repository.DrinkRepository;
import com.sptpc.hello.service.IDrinkService;
import lombok.extern.slf4j.Slf4j;
import org.joda.money.CurrencyUnit;
import org.joda.money.Money;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.validation.Valid;
import java.io.*;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

@Slf4j

@RestController
@RequestMapping("/drink")
public class DrinkController {
    @Autowired
    private IDrinkService drinkService;
    //private DrinkRepository drinkRepository;

    @GetMapping("/")
    //@ResponseBody
    public List<Drink> getAll(){
        //mock 数据    -  后期从数据库查询
       // List<Drink> results = drinkRepository.findAll();
        List<Drink> results = drinkService.getAllDriks();
//                new ArrayList<>();
//        results.add(Drink.builder().id(1)
//                .name("茉莉花茶")
//                .price(Money.parse("USD 8.00"))
//                .build());
//        results.add(Drink.builder().id(2)
//                .name("焦糖拿铁")
//                .price(Money.parse("USD 8.00"))
//                .build());
        return results;

    }

    //日志   查询
    // get /drink/1
    // path路径表示方法 id=1
    @GetMapping("/{id}")
    public Drink getDrink(@PathVariable("id") Integer id) {
        log.info("查询饮品的id：{}", id);
        //后期从数据库查询
        //select...where id = $id
        Drink drink = Drink.builder().id(1)
                .name("茉莉花茶")
                .price(Money.parse("USD 8.00"))
                .build();
        return drink;
    }

    //新增
    // 1.直接使用model类接受用户传递参数
    // 2.编写一个TD类专门负责传值
    @PostMapping("/")
    public Drink addNewDrink(@RequestBody ModifyDrinkRequest drink,
                             BindingResult bindingResult){
        if(bindingResult.hasErrors()){
            for (ObjectError error : bindingResult.getAllErrors()) {
                log.error(error.toString());
            }
            return null;
        }else{
            log.info("创建新饮品：{}", drink);
            //后期使用数据库
//            Drink addDrink = Drink.builder().id(1)
//                    .name("茉莉绿茶")
//                    .price(Money.parse("USD 8.00"))
//                    .build();

            Drink savedDrink = new Drink();
            BeanUtils.copyProperties(drink,savedDrink);

            drinkService.addNewDrink(savedDrink,drink.getCategoryId());
            return savedDrink;
        }

    }

    //修改
    @PutMapping("/")
    public Drink modifyDrink(@RequestBody ModifyDrinkRequest request){
        log.info("要修改的饮品：{}",request);
        //后期使用数据库update
//        Drink addDrink = Drink.builder().id(1)
//                .name("茉莉绿茶")
//                .price(Money.parse("USD 8.00"))
//                .build();
        //通过id查询出饮品
        Drink drink = drinkService.getDrinkById(request.getId());
      //  if(request.getName()!=null && !request.getName().equals(""))
        //复制前端要修改的属性
        BeanUtils.copyProperties(request,drink);
        //更新数据库
        drinkService.updateDrink(drink);

        return drink;

    }

    //删除
    @DeleteMapping("/{id}")
    public String deleteDrink(@PathVariable Integer id){
        log.info("要删除的饮品id：{}",id);
        drinkService.deleteDrinkById(id);
        return "删除成功";
    }

    /*
    *文件上传
    * 前端必须使用html form
    *前端类型必须设置为 multipart/form-data
    */
    @PostMapping(value = "/upload",
            consumes = {MediaType.MULTIPART_FORM_DATA_VALUE})
    public String uploadFile(MultipartFile file){
        String dest = "D:/JavaWeb/upload";
        String destFileName = dest + file.getOriginalFilename();
        File destFile = new File(destFileName);
        try {
            file.transferTo(destFile);
        } catch (IOException e) {
            e.printStackTrace();
            return "上传失败";
        }
        return "上传成功";
    }

    @PostMapping(value = "/batchupload",
            consumes = {MediaType.MULTIPART_FORM_DATA_VALUE})
    public List<Drink> batchuploadFile(MultipartFile file){
        List<Drink> results = new ArrayList<>();
        try {
//            InputStream inputStream = file.getInputStream();
//            InputStreamReader is = new InputStreamReader(inputStream);
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    file.getInputStream()));
//            String line = reader.readLine();
            String line = "";
            while ((line = reader.readLine())!=null){
                //解析一行
                //line = reader.readLine();
                String[] args = line.split(",");
                Drink drink = Drink.builder()
                        .id(Integer.parseInt(args[0]))
                        .name(args[1])
                        .price(Money.of(CurrencyUnit.of("CNY"),Double.parseDouble(args[3])))
                        .build();
            }
        } catch (IOException ioException) {
            ioException.printStackTrace();
        }
        return results;
    }
}
